cmake_minimum_required(VERSION 2.8.7)
set(CMAKE_USER_MAKE_RULES_OVERRIDE cmake/c_flag_overrides.cmake)
project(stlink C)
set(PROJECT_DESCRIPTION "Open source version of the STMicroelectronics Stlink Tools")
set(STLINK_UDEV_RULES_DIR "/etc/udev/rules.d" CACHE PATH "Udev rules directory")
set(STLINK_MODPROBED_DIR "/etc/modprobe.d" CACHE PATH "modprobe.d directory")
set(STLINK_STATIC_LIB ON CACHE BOOL "Install static lib")

if( IS_DIRECTORY ${LIB_INSTALL_DIR})
    set(LIB_INSTALL_DIR ${LIB_INSTALL_DIR} CACHE PATH "Main library directory")
    set(STLINK_LIBRARY_PATH "${LIB_INSTALL_DIR}")
else()
    set(LIB_INSTALL_DIR "lib" CACHE PATH "Main library directory")
    set(STLINK_LIBRARY_PATH "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}" )
endif()

if( IS_DIRECTORY ${INCLUDE_INSTALL_DIR})
    set(INCLUDE_INSTALL_DIR ${INCLUDE_INSTALL_DIR} CACHE PATH "Main include directory")
    set(STLINK_INCLUDE_PATH "${INCLUDE_INSTALL_DIR}" )
else()
    set(INCLUDE_INSTALL_DIR "include" CACHE PATH "Main include directory")
    set(STLINK_INCLUDE_PATH "${CMAKE_INSTALL_PREFIX}/${INCLUDE_INSTALL_DIR}")
endif()

option(STLINK_GENERATE_MANPAGES "Generate manpages with pandoc" OFF)
option(STLINK_INSTALL_UDEV_RULES "Install udev rules files" ON)
option(STLINK_INSTALL_MODPROBE_CONF "Install modprobe conf files" ON)

if (POLICY CMP0042)
	# Newer cmake on MacOS should use @rpath
	cmake_policy (SET CMP0042 NEW)
endif ()

set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_SOURCE_DIR}/cmake/modules")
include(cmake/Version.cmake)
if(NOT MSVC)
    include(cmake/CFlags.cmake)
endif()

###
# Dependencies
###
find_package(LibUSB REQUIRED)
if (NOT APPLE AND NOT WIN32 AND NOT CMAKE_CROSSCOMPILING)
	find_package(PkgConfig)
	pkg_check_modules(gtk gtk+-3.0)
endif ()

include(CheckIncludeFile)
CHECK_INCLUDE_FILE(sys/mman.h STLINK_HAVE_SYS_MMAN_H)
if (STLINK_HAVE_SYS_MMAN_H)
	add_definitions(-DSTLINK_HAVE_SYS_MMAN_H)
endif()

CHECK_INCLUDE_FILE(unistd.h STLINK_HAVE_UNISTD_H)
if (STLINK_HAVE_UNISTD_H)
	add_definitions(-DSTLINK_HAVE_UNISTD_H)
endif()

if (CMAKE_BUILD_TYPE STREQUAL "")
	set(CMAKE_BUILD_TYPE "Debug")
endif()

if (${CMAKE_BUILD_TYPE} MATCHES "Debug")
	include(CTest)
endif()

set(STLINK_HEADERS
	include/stlink.h
	include/stlink/usb.h
	include/stlink/sg.h
	include/stlink/logging.h
	include/stlink/mmap.h
	include/stlink/chipid.h
	include/stlink/flash_loader.h
)

set(STLINK_SOURCE
	src/chipid.c
	src/common.c
	src/usb.c
	src/sg.c
	src/logging.c
	src/flash_loader.c
)

if (WIN32 OR MSYS OR MINGW)
	set (STLINK_SOURCE "${STLINK_SOURCE};src/mmap.c;src/mingw/mingw.c")
	set (STLINK_HEADERS "${STLINK_HEADERS};src/mingw/mingw.h")
endif ()

include_directories(${LIBUSB_INCLUDE_DIR})
include_directories(include)
include_directories(${PROJECT_BINARY_DIR}/include)
include_directories(src/mingw)
if (MSVC)
	include_directories(src/win32)
	include_directories(src/getopt)
	# Use string.h rather than strings.h and disable annoying warnings
	add_definitions(-DHAVE_STRING_H -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS /wd4710)
endif ()

###
# Shared library
###
if (NOT WIN32)
set(STLINK_LIB_SHARED ${PROJECT_NAME})
else ()
set(STLINK_LIB_SHARED ${PROJECT_NAME}-shared)
endif()

add_library(${STLINK_LIB_SHARED} SHARED
	${STLINK_HEADERS} # header files for ide projects generated by cmake
	${STLINK_SOURCE}
)
target_link_libraries(${STLINK_LIB_SHARED} ${LIBUSB_LIBRARY})

if (WIN32 OR MSYS OR MINGW)
	set(STLINK_SHARED_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR})
else()
	set(STLINK_SHARED_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH})
endif()

set_target_properties(${STLINK_LIB_SHARED}
	PROPERTIES SOVERSION ${PROJECT_VERSION_MAJOR}
	VERSION ${STLINK_SHARED_VERSION}
)

# Link shared library with apple OS libraries
if (APPLE)
	find_library(ObjC objc)
	find_library(CoreFoundation CoreFoundation)
	find_library(IOKit IOKit)
	target_link_libraries(${STLINK_LIB_SHARED} ${CoreFoundation} ${IOKit} ${ObjC})
endif()

if (WIN32 OR MSYS OR MINGW)
	target_link_libraries(${STLINK_LIB_SHARED} ${LIBUSB_LIBRARY} wsock32 ws2_32)
else()
	target_link_libraries(${STLINK_LIB_SHARED} ${LIBUSB_LIBRARY})
endif()


install(TARGETS ${STLINK_LIB_SHARED}
	DESTINATION ${STLINK_LIBRARY_PATH}
)

###
# Static library
###
set(STLINK_LIB_STATIC ${PROJECT_NAME}-static)

add_library(${STLINK_LIB_STATIC} STATIC
	${STLINK_HEADERS} # header files for ide projects generated by cmake
	${STLINK_SOURCE}
)

# Link shared library with apple OS libraries
if (APPLE)
	find_library(ObjC objc)
	find_library(CoreFoundation CoreFoundation)
	find_library(IOKit IOKit)
	target_link_libraries(${STLINK_LIB_STATIC} ${CoreFoundation} ${IOKit} ${ObjC})
endif()
	
if (WIN32 OR MSYS OR MINGW)
	target_link_libraries(${STLINK_LIB_STATIC} ${LIBUSB_LIBRARY} wsock32 ws2_32)
else()
	target_link_libraries(${STLINK_LIB_STATIC} ${LIBUSB_LIBRARY})
endif()

set_target_properties(${STLINK_LIB_STATIC} PROPERTIES OUTPUT_NAME ${PROJECT_NAME})

if (STLINK_STATIC_LIB)
    install(TARGETS ${STLINK_LIB_STATIC}
        ARCHIVE DESTINATION ${STLINK_LIBRARY_PATH}
    )
endif()

###
# Tools
###
add_executable(st-flash src/tools/flash.c src/tools/flash_opts.c)
if (WIN32 OR APPLE)
	target_link_libraries(st-flash ${STLINK_LIB_STATIC})
else()
	target_link_libraries(st-flash ${STLINK_LIB_SHARED})
endif()

add_executable(st-info src/tools/info.c)
if (WIN32 OR APPLE)
	target_link_libraries(st-info ${STLINK_LIB_STATIC})
else()
	target_link_libraries(st-info ${STLINK_LIB_SHARED})
endif()

install(TARGETS st-flash st-info
	RUNTIME DESTINATION bin
)

if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
	if (STLINK_INSTALL_MODPROBE_CONF)
		install(FILES etc/modprobe.d/stlink_v1.conf
		DESTINATION ${STLINK_MODPROBED_DIR}/)
	endif()
	if (STLINK_INSTALL_UDEV_RULES)
		file(GLOB RULES_FILES etc/udev/rules.d/*.rules)
		install(FILES ${RULES_FILES}
		DESTINATION ${STLINK_UDEV_RULES_DIR}/)
	endif()
endif()

add_subdirectory(src/gdbserver)
add_subdirectory(src/tools/gui)

###
# Others
###
add_subdirectory(usr/lib/pkgconfig)
add_subdirectory(include)
add_subdirectory(doc/man)
add_subdirectory(tests)

include(cmake/CPackConfig.cmake)
include(CPack)
